package com.snack.shop.service;

import com.snack.shop.dto.WxPayNotifyResult;
import com.snack.shop.dto.WxPayResponseDTO;
import com.snack.shop.entity.Order;

/**
 * 微信支付服务接口
 */
public interface WxPayService {

    /**
     * 创建预支付订单
     *
     * @param order  订单信息
     * @param openid 用户openid
     * @return 支付参数
     */
    WxPayResponseDTO createPrepayOrder(Order order, String openid);

    /**
     * 查询订单支付状态
     *
     * @param orderNo 订单号
     * @return 支付结果
     */
    WxPayNotifyResult queryOrderStatus(String orderNo);

    /**
     * 处理支付回调通知
     *
     * @param requestBody 回调请求体
     * @param signature   签名
     * @param serial      证书序列号
     * @param timestamp   时间戳
     * @param nonce       随机字符串
     * @return 解密后的通知数据
     */
    WxPayNotifyResult handlePayNotify(String requestBody, String signature, String serial, String timestamp, String nonce);

    /**
     * 申请退款（全额）
     *
     * @param order        订单信息
     * @param refundReason 退款原因
     * @return 退款单号
     */
    String refund(Order order, String refundReason);

    /**
     * 申请退款（支持部分退款）
     *
     * @param order        订单信息
     * @param refundReason 退款原因
     * @param refundAmount 退款金额（为null时全额退款）
     * @return 退款单号
     */
    String refund(Order order, String refundReason, java.math.BigDecimal refundAmount);

    /**
     * 查询退款状态
     *
     * @param refundNo 退款单号
     * @return 退款状态
     */
    String queryRefundStatus(String refundNo);
}

